package encrypt

import (
	"encoding/csv"
	"io"
	"os"
)

//csv转换为结构体和结构体转换为csv 在底层中把传入的参数限制死了必须是实际数据类型的地址,而且此地址必须是可修改的 ,所以我们不能进行二次封装,在测试中我们有使用案例

// 读取csv文件
func ReadCsvFile(filePath string, symbols rune, skipTitle bool, line func([]string) error) error {
	file, err := os.Open(filePath)
	// 延迟关闭文件
	defer file.Close()
	if err != nil {
		return err
	}
	reader := csv.NewReader(file)
	reader.Comma = symbols
	if skipTitle {
		_, err = reader.Read() // 读取标题
		if err != nil {
			return err
		}
	}
	for {
		line1, err := reader.Read() // 读取一行数据, 返回 []string
		if err == io.EOF {
			break
		}
		if err != nil {
			return err
		}
		err = line(line1)
		if err != nil {
			return err
		}
	}
	return nil
}

// 写入csv文件
func WriteCsvFile(filePath string, symbols rune, title []string, content [][]string) error {
	file, err := os.Create(filePath)
	defer file.Close()
	if err != nil {
		return err
	}
	writer := csv.NewWriter(file)
	writer.Comma = symbols
	writer.Write(title)      //写入标题
	writer.WriteAll(content) //写入数据
	if err := writer.Error(); err != nil {
		return err
	}
	// 可以调用Flush函数立刻将缓冲区中的数据写入文件中
	writer.Flush()
	return nil
}
